home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sys / busyio.c < prev    next >
C/C++ Source or Header  |  1990-12-19  |  3KB  |  147 lines

  1.  
  2. /*
  3.  * @(#)busyio.c 1.1 86/09/27
  4.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  5.  */
  6.  
  7. /*
  8.  * busyio.c:  busywait I/O module for Sun ROM monitor.
  9.  */
  10.  
  11. #include "../sun3/cpu.addrs.h"
  12. #include "../dev/saio.h"
  13. #include "../dev/zsreg.h"
  14. #include "../sun3/sunmon.h"
  15. #include "../h/globram.h"
  16.  
  17. putchar(x)
  18.     register unsigned char x;
  19. {
  20.     if (x == '\n') putchar('\r');
  21.     while (mayput (x)) ;
  22. }
  23.  
  24. /*
  25.  *    "Maybe put" routine -- puts a character if possible, returns
  26.  *    zero if it did and -1 if it didn't (because Uart wasn't ready).
  27.  */
  28. int
  29. mayput(x)
  30.     unsigned char x;
  31. {
  32.     if (gp->g_diagecho == 0x12) {
  33.        if (gp->g_outzscc[2 - gp->g_sccflag].zscc_control & ZSRR0_TX_READY) {
  34.                    DELAY(10);
  35.                    gp->g_outzscc[2 - gp->g_sccflag].zscc_data = x;
  36.                    fwritechar (x);
  37.                    return 0;
  38.            }
  39.     } else {
  40.           if (OUTSCREEN == gp->g_outsink) {
  41.         fwritechar (x);
  42.         return 0;
  43.        }
  44.  
  45.         if (gp->g_outzscc[2-gp->g_outsink].zscc_control & ZSRR0_TX_READY) {
  46.         DELAY(10);
  47.         gp->g_outzscc[2-gp->g_outsink].zscc_data = x;
  48.         return 0;
  49.        }
  50.     }
  51.     return -1;
  52. }
  53.  
  54. /*
  55.  * Get, and echo if desired, a characters.  Wait until one arrives.
  56.  */
  57. unsigned char
  58. getchar()
  59. {
  60.     register int c;
  61.  
  62.     do  c = mayget(); while (c<0);
  63.     if (gp->g_echo)
  64.         putchar( (unsigned char)c);
  65.     return (c);
  66. }
  67.  
  68. /*
  69.  * Maybe get a character.  Return it if one is there, else return -1.
  70.  */
  71. int
  72. mayget()
  73. {
  74.     int     c;
  75.  
  76.     if (gp->g_diagecho == 0x12) {
  77.            c = getkey();       /* Let's check the keyboard first */
  78.            if (c != -1) {       /* Is there a keyboard character */
  79.         if (c == '#') {
  80.            remote_msg(0);  /* Initiate message to SCC */
  81.            c = -1;         /* Invalidate the keyboard input */
  82.         } else if (gp->g_insource != INKEYB) {
  83.            c = -1;       /* Ignore the keyboard input */
  84.         }
  85.         return(c);         /* pick up keyboard char & quit. */
  86.        }
  87.  
  88.        if (!(gp->g_inzscc[2 - gp->g_sccflag].zscc_control & ZSRR0_RX_READY))
  89.         return (-1);       /* no input from the SCC */
  90.  
  91.        DELAY(10);
  92.        c = gp->g_inzscc[2 - gp->g_sccflag].zscc_data & NOPARITY;
  93.        if (c == '#') { 
  94.               remote_msg(1);  /* Initiate message to Video */
  95.               c = -1;         /* Invalidate the SCC input */ 
  96.            } else if (gp->g_insource == INKEYB) {
  97.               c = -1;         /* Ignore the SCC input */ 
  98.            }
  99.            return(c);
  100.     } else {
  101.        if (INKEYB == gp->g_insource) 
  102.         return (getkey());  /* Just pick up a keyboard char & quit. */
  103.  
  104.        if (!(gp->g_inzscc[2-gp->g_insource].zscc_control & ZSRR0_RX_READY))
  105.         return (-1);    /* no char pending */
  106.        DELAY(10);
  107.        return gp->g_inzscc[2-gp->g_insource].zscc_data & NOPARITY;
  108.     }
  109. }
  110.  
  111. /*
  112.  *    Allow remote messages when in Echo mode
  113.  */
  114.  
  115. int
  116. remote_msg(scc) 
  117.     int    scc;
  118. {
  119.     int    c;
  120.  
  121.     printf("\n*** Message from %s:  ", scc == 0 ? "Keyboard" : "SCC");
  122.  
  123.     for (;;) {        /* Loop until User ends message */
  124.        if (scc) {
  125.         DELAY(10);
  126.         if (!(gp->g_inzscc[2 - gp->g_sccflag].zscc_control & ZSRR0_RX_READY))
  127.             continue;
  128.         c = gp->g_inzscc[2 - gp->g_sccflag].zscc_data & NOPARITY;
  129.         DELAY(10);
  130.         } else {
  131.         if ((c = getkey()) == -1)    /* Check for keyboard input */
  132.             continue;
  133.        }
  134.  
  135.        if (c == '#') {            /* Special character for EOM */
  136.         printf("\n*** End of Message ***\n");
  137.                    break;
  138.        }
  139.  
  140.        if (c == '\r')        /* Display new line for <CR> */
  141.                 printf("\n");
  142.        else                /* Display other characters */
  143.         putchar(c);
  144.     }
  145. }
  146.  
  147.